#include <buola/gui/x11/auto.h>

#include <buola/gui/x11/cx11color.h>
#include <buola/gui/x11/cx11display.h>

#include <math.h>

namespace buola { namespace gui { namespace x11 {

std::unordered_map<img::CColor,CX11Color*> CX11Color::mX11Colors;

const XColor &CX11Color::GetXColor()
{
    if(!(mValid&VALID_X))
    {
        if(!(mValid&VALID_XFT))
            GetXftColor();

        mX.red=mXft.color.red;
        mX.green=mXft.color.green;
        mX.blue=mXft.color.blue;
        mX.pixel=mXft.pixel|(uint32_t(mColor.a*255.0)<<24);

        mValid|=VALID_X;
    }

    return mX;
}

XftColor *CX11Color::GetXftColor()
{
    if(!(mValid&VALID_XFT))
    {
        XftColorAllocValue(get_default_x11_display()->GetDisplay(),
                           get_default_x11_display()->GetVisual(),
                           get_default_x11_display()->GetColormap(),
                           GetRenderColor(),&mXft);
        mValid|=VALID_XFT;
    }

    return &mXft;
}

XRenderColor *CX11Color::GetRenderColor()
{
    if(!(mValid&VALID_RENDER))
    {
        mRender.red=mColor.r*65535.0;
        mRender.green=mColor.g*65535.0;
        mRender.blue=mColor.b*65535.0;
        mRender.alpha=mColor.a*65535.0;

        mValid|=VALID_RENDER;
    }

    return &mRender;
}

CX11Color *CX11Color::GetX11Color(const img::CColor &pColor)
{
    CX11Color *lColor=mX11Colors[pColor];

    if(!lColor)
    {
        lColor=new CX11Color(pColor);
        mX11Colors[pColor]=lColor;
    }

    return lColor;
}

/*namespace x11*/ } /*namespace gui*/ } /*namespace buola*/ }
